package com.evaluation.config;

import ch.qos.logback.classic.LoggerContext;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.stereotype.Component;

import javax.annotation.PreDestroy;

/**
 * 应用关闭配置类
 * 确保应用关闭时资源能够正确释放
 */
@Component
public class ShutdownConfig implements DisposableBean {

    /**
     * Spring Bean销毁时调用
     */
    @Override
    public void destroy() throws Exception {
        shutdownImageIO();
        shutdownLogback();
    }

    /**
     * 关闭ImageIO资源，避免StreamCloser线程出现NullPointerException
     */
    @PreDestroy
    public void shutdownImageIO() {
        try {
            // 清理ImageIO的缓存流，避免应用关闭时StreamCloser线程出现NullPointerException
            // 通过设置系统属性来禁用ImageIO的缓存，避免StreamCloser线程问题
            System.setProperty("java.awt.headless", "true");
            // 清理ImageIO的缓存目录（如果存在）
            String cacheDir = System.getProperty("java.io.tmpdir");
            if (cacheDir != null) {
                // ImageIO的缓存文件通常在临时目录中，JVM关闭时会自动清理
                // 这里只是确保headless模式已设置
            }
        } catch (Exception e) {
            // 忽略关闭时的异常，避免影响应用正常关闭
        }
    }

    /**
     * 关闭logback日志上下文
     */
    @PreDestroy
    public void shutdownLogback() {
        try {
            LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
            if (loggerContext != null) {
                loggerContext.stop();
            }
        } catch (Exception e) {
            // 忽略关闭时的异常，避免影响应用正常关闭
            System.err.println("关闭日志上下文时发生异常: " + e.getMessage());
        }
    }
}

